/**
 * 显示对象缩放帮助类
 * ibio-develop
 * 2010-3-14 21:34
 */
package com.ibio8.components.helpers {
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.LoaderInfo;
	import flash.display.Loader;
	import flash.geom.Rectangle;
	import flash.geom.Point;
	/**
	 * 显示对象缩放帮助类。
	 * 
	 * <p>
	 * 包括图片和 swf 的（等比）缩放。
	 * </p>
	 */
	public class ObjectScaleHelper {
		/**
		 * 改变给定对象的缩放和位置
		 * @param	mc			指定容器
		 * @param	newW		新的宽度
		 * @param	newH		新的高度
		 * @param	scaleMode	缩放模式
		 * 0：居中显示，不缩放
		 * 1：缩放到当前窗口大小
		 * 2：居中显示，缩放且保持高宽比
		 */
		static public function maintainAspect(mc:DisplayObject, newW:Number, newH:Number, scaleMode:uint = 0):void {
			//如果容器小于显示窗口大小
			if ((mc.width <= newW) && (mc.height <= newH)) {
				mc.x += (newW - mc.width) / 2;
				mc.y += (newH - mc.height) / 2;
			}else {
				//缩放到当前窗口大小
				if(scaleMode == 1){
					mc.width = newW;
					mc.height = newH;
				//等比例缩放
				}else if (scaleMode == 2) {
					var flag:uint = changeSize(mc, newW, newH);
					var deltaPoint:Point = changePosition(mc, newW, newH, flag);
					mc.x += deltaPoint.x;
					mc.y += deltaPoint.y;
				}else {
					if (mc.width <= newW) {
						mc.x += (newW - mc.width) / 2;
					}else if (mc.height <= newH) {
						mc.y += (newH - mc.height) / 2;
					}
				}
			}
		}
		
		/**
		 * 等比例缩放容器到指定的宽高
		 * @param	mc		指定容器
		 * @param	newW	新的宽度
		 * @param	newH	新的高度
		 * @return			当前缩放的居中方式：0 水平居中；1 垂直居中
		 */
		static public function changeSize(mc:DisplayObject, newW:Number, newH:Number):uint {
			var width:Number = mc.width;
			var height:Number = mc.height;
			var ratio:Number = 1;
			//flag是居中方式: 0--水平,1--垂直
			var flag:uint = 0;
			var pW:Number = newW / width;
			var pH:Number = newH / height;
			/**
			 * 如果宽度的缩放比 > 高度的缩放比, 则使用高度的缩放比
			 * 否则使用宽度的缩放比, 把照片缩小到 (newW * newH) 以内
			 */
			if (pW > pH){	
				ratio = pH;
			}else{
				ratio = pW;
				flag = 1;
			}
			mc.width = width * ratio;
			mc.height = height * ratio;
			return flag;
		}
		
		/**
		* 将mc限定在特定容器的宽高内，并使相对位置居中
		* @param	mc		指定容器
		* @param	newW 	新的宽度
		* @param	newH 	新的高度
		* @param 	flag	居中方式
		* @return			返回容器当前的 x、y 坐标
		*/
		static public function changePosition(mc:DisplayObject, newW:Number, newH:Number, flag:uint = 0):Point {
			var point:Point = new Point(0, 0);
			if (flag == 0) {
				point.x = (newW - mc.width) / 2;
			}else{
				point.y = (newH - mc.height) / 2;
			}
			return point;
		}
		
		/**
		 * 改变加载的 swf 的缩放和位置，并使得超出画布显示区域的不规则 swf 仍能够正常显示
		 * @param	loader	加载的 loader 对象
		 * @param	newW	新的宽度
		 * @param	newH	新的高度
		 * 注意：由于在 flashplayer 中不同的虚拟机之间不能交互，所以仅仅限于 AS3 的 swf
		 */
		static public function maintainSWFAspect(loader:Loader, newW:Number, newH:Number):void {
			//载入的MC
			var mc:MovieClip = loader.contentLoaderInfo.content as MovieClip;
			//载入MC的舞台宽度
			var mcStageW:Number = loader.contentLoaderInfo.width;
			//载入MC的舞台高度
			var mcStageH:Number = loader.contentLoaderInfo.height;
			//载入MC的实际宽度
			var mcW:Number = mc.width;
			//载入MC的实际高度
			var mcH:Number = mc.height;
			//是缩放 MC 适应显示宽度，还是缩放高度(载入MC舞台的宽高比是否大于显示区域宽高比)
			var useWithScale:Boolean = ((mcStageW / mcStageH) > (newW / newH));
			//缩放比率
			var scaleRate:Number = useWithScale ? (newW / mcStageW) : (newH / mcStageH);
			//缩放MC
			mc.scaleX = mc.scaleY = scaleRate;
			//显示载入MC的显示范围
			mc.scrollRect = new Rectangle(0, 0, mcStageW, mcStageH);
			if (useWithScale) {
				loader.y += (newH - mcStageH * scaleRate) / 2;
			}else {
				loader.x += (newW - mcStageW * scaleRate) / 2;
			}
		}
	}
}